JavaBean属性拷贝 | 您所在的位置:网站首页 › java bean 复制 › JavaBean属性拷贝 |
需求
有两个类,他们属性数据类型相同,但名字不同,如何数据的拷贝? 举例: 我们在Service层可能用到的是 UserDTO 类,而页面需要的是 UserVO,我们需要将这个 UserDTO 变成 UserVO 怎么做? 笨方法: 先 UserVO vo = new UserVo(),然后调用 vo.setXXX(dto.getXXX()) 挨个往属性中赋值。 这种方法在 属性少的情况下或许还没什么问题。但是如果需要拷贝对象的属性非常多,且有的属性是集合类型的,这种笨方法处理起来就非常的麻烦了 实验案例 定义2个类UserDTO 类 @Data @NoArgsConstructor @AllArgsConstructor public class UserDTO { private String userName; private Integer userAge; private Integer weight; }UserVO类 @Data @NoArgsConstructor @AllArgsConstructor public class UserVO { private String name; private Integer age; private Integer weight; } 定义一个函数式接口 @FunctionalInterface public interface BeanUtilCopyCallBack { /** * 定义默认回调方法 * @param t * @param s */ void callBack(S t, T s); } 定义属性拷贝的工具类 public class BeanUtilCopy extends BeanUtils { /** * 集合数据的拷贝 * * @param sources: 数据源类 * @param target: 目标类::new(eg: UserVO::new) * @return */ public static List copyListProperties(List sources, Supplier target) { return copyListProperties(sources, target, null); } /** * 带回调函数的集合数据的拷贝(可自定义字段拷贝规则) * * @param sources: 数据源类 * @param target: 目标类::new(eg: UserVO::new) * @param callBack: 回调函数 * @return */ public static List copyListProperties(List sources, Supplier target, BeanUtilCopyCallBack callBack) { List list = new ArrayList(sources.size()); for (S source : sources) { T t = target.get(); copyProperties(source, t); list.add(t); if (callBack != null) { // 回调 callBack.callBack(source, t); } } return list; } } 编写测试用例 @Test public void contextLoads(){ List userDTOList = new ArrayList(); userDTOList.add(new UserDTO("zhangsan", 19, 200)); userDTOList.add(new UserDTO("lisi", 20, 300)); List userVOList = BeanUtilCopy.copyListProperties(userDTOList, UserVO::new, (userDTO, userVO) -> { userVO.setName(userDTO.getUserName()); userVO.setAge(userDTO.getUserAge()); }); System.out.println(userVOList); } 测试结果
|
CopyRight 2018-2019 实验室设备网 版权所有 |